package com.sojson.util.mq.rabbit.interfaces;

import java.util.HashMap;
import java.util.Map;

import com.sojson.constant.Constant;
import com.sojson.util.text.Convert;

/**
 * Rabbit声明队列工具类接口
 * 
 * @author liu
 * @date 2022-06-16
 */
public interface IRabbitBaseQueueUtil extends IRabbitBaseUtil {

    /** 队列存储消息的最大值(单位: 字节,默认2G) */
    int MAX_LENGTH_BYTES = Convert.toInt(Constant.PROPERTIES.getProperty("so.mq.rabbit.maxLengthBytes"), 1024 * 1024);

    /**
     * 获取 队列基础属性
     * 
     * @return
     */
    default Map<String, Object> getBaseQueueParam() {
        Map<String, Object> map = new HashMap<>(10);
        // 为当前队列设置存活时间(单位: 毫秒)
        // map.put("x-expires", 1800000);

        // 为当前队列的每一条消息设置存活时间(单位: 毫秒)
        // map.put("x-message-ttl", 3000);

        // 当x-max-length与x-max-length-bytes都设置时,无论哪个达到限制都会触发溢出策略
        // 溢出策略有两种,1:丢弃最前面的消息(默认),2:拒绝发布,修改方式为启动发布者确认机制(https://www.rabbitmq.com/confirms.html#publisher-confirms)
        // 队列最多容纳10条数据
        map.put("x-max-length", 10);

        // 消息最大长度(单位: 字节)
        map.put("x-max-length-bytes", MAX_LENGTH_BYTES);

        // 队列满后的处理策略(默认: drop-head)
        // drop-head(删除queue头部的消息)
        // reject-publish(最近发来的消息将被丢弃)
        // reject-publish-dlx(拒绝发送消息到死信交换器)
        // 类型为quorum 的queue只支持drop-head
        map.put("x-overflow", "reject-publish");

        // 设置队列的优先级,参数可以写1到255之间,数字越大,优先级越高,实际使用中建议使用1到10之间选择,未设置的都为0
        // 设置优先级都有一些内存和磁盘成本,还有额外的CPU成本,优先级设置的越高消耗越大(erlang进程开启的越多)
        // map.put("x-max-priority", 10);

        // 当存在多个消费者时,默认会使用循环的方式去消费消息
        // 当设置某个消费者优先级后,只有当改消费者受阻时消息才发送给低优先级消费者消费,同级别的优先级消费者仍然采取循环的方式消费
        // map.put("x-priority", 1);

        // 添加到死信队列
        // 死信交换机
        // map.put("x-dead-letter-exchange", RabbitUtil.getExchangeName(RabbitUtil.EXCHANGE_SIXIN));

        // 死信路由Key
        // map.put("x-dead-letter-routing-key", RabbitUtil.getRoutingKeyName(RabbitUtil.ROUTING_KEY_SIXIN));
        return map;
    }

    /**
     * 获取 队列属性
     * 
     * @return
     */
    default Map<String, Object> getQueueParam() {
        Map<String, Object> map = getBaseQueueParam();
        // 当x-max-length与x-max-length-bytes都设置时,无论哪个达到限制都会触发溢出策略
        // 溢出策略有两种,1:丢弃最前面的消息(默认),2:拒绝发布,修改方式为启动发布者确认机制(https://www.rabbitmq.com/confirms.html#publisher-confirms)
        // 队列最多容纳10条数据
        // map.put("x-max-length", 10);

        // 消息最大长度(单位: 字节)
        // map.put("x-max-length-bytes", 1024);
        return map;
    }

}